package com.zfl.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class JwtUtils {

    @Value("${jwt.secret}") // 从配置文件读取密钥（如application.yml中的jwt.secret）
    private String secret;

    @Value("${jwt.expire-time}") // 从配置文件读取过期时间（毫秒，如7200000=2小时）
    private long expireTime;

    /**
     * 生成Token（仅包含userId，角色信息从Redis获取）
     * @param userId 用户ID
     * @return JWT字符串
     */
    public String generateToken(Long userId) {
        return JWT.create()
                .withClaim("userId", userId) // 仅存储用户ID
                .withExpiresAt(new Date(System.currentTimeMillis() + expireTime)) // 过期时间
                .sign(Algorithm.HMAC256(secret)); // HMAC256签名（使用配置的密钥）
    }

    /**
     * 从Token中解析userId（拦截器核心方法）
     * @param token JWT字符串
     * @return 解析成功返回userId；失败返回null（如Token无效/过期）
     */
    public Long getUserIdFromToken(String token) {
        try {
            // 验证Token签名和过期时间
            DecodedJWT jwt = JWT.require(Algorithm.HMAC256(secret))
                    .build()
                    .verify(token);
            // 提取userId
            return jwt.getClaim("userId").asLong();
        } catch (JWTVerificationException e) {
            // Token无效（签名错误/过期）时返回null，由拦截器处理
            return null;
        }
    }

    /**
     * 验证Token是否有效（可选，可直接通过getUserIdFromToken的返回值判断）
     * @param token JWT字符串
     * @return 有效返回true；无效返回false
     */
    public boolean verifyToken(String token) {
        return getUserIdFromToken(token) != null;
    }
}